<?php
namespace Modules\Wechat\Model\Dao\Db;

/**
 * 微信消息交互记录
 *
 * 公众号与用户之间的消息交互记录.
 *
 * @package Modules\Wechat\Model\Dao\Db
 */
class WcMsgExchange extends Abstraction
{
    /** @var int 记录ID */
    public $id = null;

    /** @var string 消息所属公众号的微信号 */
    public $official_account = '';

    /** @var string */
    public $type = '';

    /** @var string 发送消息的用户：如果发送消息的是公众号，则此处是公众号的微信号；如果发消息的是普通用户，则此处是用户的OpenID。 */
    public $from = '';

    /** @var string 接收消息的用户：如果消息是发给用户的则此处是用户的OpenID，如果消息是发给公众号的则此处就公众号的微信号。 */
    public $to = '';

    /** @var int 数据创建时间：时间戳，交互被记录的时间。 */
    public $ctime = '0';

    /** @var int 消息实际发送时间：时间戳，与消息中标记的timestamp一致。 */
    public $stime = '0';

    /** @var string 消息内容：JSON字符串。 */
    public $msg_json = '';

    protected function init()
    {
        return $this->setTableName('msg_exchange')
                    ->setPkField('id')
                    ->resetProperties();
    }

    /**
     * 添加一条记录
     *
     * @return int
     */
    public function add()
    {
        return $this->create(true);
    }

    /**
     * 获取列表
     *
     * @param string $official_account
     * @param string $type
     * @param string $from
     * @param string $to
     * @param int    $stime_start
     * @param int    $stime_end
     * @param int    $limit
     *
     * @return array
     */
    public function getList($official_account, $type, $from, $to, $stime_start = 0, $stime_end = 0, $limit = 0)
    {
        $sql    = "SELECT * FROM {$this->getTableName()}";
        $where  = [];
        $params = [];
        if ($official_account) {
            $where[]       = '`official_account` = :oa';
            $params[':oa'] = $official_account;
        }
        if ($type) {
            $where[]         = '`type` = :type';
            $params[':type'] = $type;
        }
        if ($from) {
            $where[]         = '`from` = :from';
            $params[':from'] = $from;
        }
        if ($to) {
            $where[]       = '`to` = :to';
            $params[':to'] = $to;
        }
        if ($stime_start) {
            $where[]                = '`stime` > :stime_start';
            $params[':stime_start'] = $stime_start;
        }
        if ($stime_end) {
            $where[]              = '`stime` < :stime_end';
            $params[':stime_end'] = $stime_end;
        }
        if ($where) {
            $sql = "{$sql} WHERE " . implode(' AND ', $where);
        }
        $sql = "{$sql} ORDER BY {$this->getPkField()} ASC";
        if ($limit) {
            $sql = "{$sql} LIMIT {$limit}";
        }
        $list = $this->db()->qsql($sql, $params);
        return $list ?: [];
    }
}